import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import dts from 'vite-plugin-dts'

export default defineConfig({
  plugins: [
    vue(),
    dts({
      // 针对多入口点构建的优化配置
      entryRoot: 'libs',
      outDir: 'dist',
      exclude: [
        'libs/main.ts', 
        'libs/App.vue',
        'node_modules/**',
        'dist/**'
      ],
      include: [
        'libs/**/*.ts',
        'libs/**/*.vue' // 包含 .vue 文件以获取组件类型
      ],
      // 使用项目的 tsconfig 配置
      tsconfigPath: './tsconfig.app.json',
      // 不插入类型入口，我们手动管理
      insertTypesEntry: false,
      // 静态导入分析
      staticImport: true,
      // 不合并类型文件，保持目录结构
      rollupTypes: false,
      // 复制已存在的 .d.ts 文件
      copyDtsFiles: true,
      // 处理Vue组件的类型定义
      beforeWriteFile: (filePath, content) => {
        // // 处理对Vue组件的引用，确保正确指向.vue.d.ts文件
        // if (content.includes('.vue') || content.includes("from './Modal'") || content.includes("from './Button'")) {
        //   // 修复对Vue组件的直接引用，指向正确的.vue文件
        //   content = content.replace(/from '(\.\/[^']+)'/g, (match, path) => {
        //     // 如果是对组件文件的引用但没有扩展名，且存在对应的.vue文件，则添加.vue扩展名
        //     if (path === './Modal' || path === './Button') {
        //       return `from '${path}.vue'`;
        //     }
        //     return match;
        //   });
        //   // 移除.vue扩展名的处理（因为我们需要保留它）
        //   // content = content.replace(/from '(\.\/[^']+)\.vue'/g, "from '$1'")
        // }
        return { filePath, content }
      }
    })
  ],
  build: {
    lib: {
      entry: {
        // 主入口
        index: resolve(__dirname, 'libs/index.ts'),
        // 组件单独入口
        'components/index': resolve(__dirname, 'libs/components/index.ts'),
        'components/button': resolve(__dirname, 'libs/components/Button/index.ts'),
        'components/modal': resolve(__dirname, 'libs/components/Modal/index.ts'),
        // 工具函数单独入口
        'utils/index': resolve(__dirname, 'libs/utils/index.ts'),
        'utils/format': resolve(__dirname, 'libs/utils/format/index.ts'),
        'utils/validation': resolve(__dirname, 'libs/utils/validation/index.ts'),
      },
      name: 'VueToolkit',
      fileName: (format, entryName) => {
        if (entryName === 'index') {
          return `vue-toolkit.${format}.js`
        }
        return `${entryName}.${format}.js`
      },
      formats: ['es', 'cjs']
    },
    rollupOptions: {
      external: ['vue'],
      output: {
        globals: {
          vue: 'Vue'
        },
        // 保持目录结构
        preserveModules: false,
        // 确保每个入口都生成独立的文件
        manualChunks: undefined,
        // 优化辅助文件名称
        chunkFileNames: '[name]-[hash].js',
        // 减少不必要的辅助文件
        compact: true
      }
    },
    cssCodeSplit: false,
    emptyOutDir: true
  }
})